<?php
/************************************************
 *  描述: 文件操作类
 *  作者: firmit 
 *  创建: 2010-04-20
 *  更新: 2012-03-20
 *        使用自定义的异常类替换php自带的异常类
 *  ToDO: 文件的读写对中文支持的不好，需要修改 
 ************************************************/

class MC_FileBase extends  MC_Base{
    //文件名
    protected $fname="";
    //路径
    protected $path="";
    //全名
    protected $fullname="";
    //实际路径
    protected $realpath="";
    //mask
    protected $mask = "0x755";
    //容量
    protected $size = NULL;
    //文件类型
    protected $extname = "";
    
    function __construct($fname, $mask = "0x755"){
        $this->set("logFile", MC_ROOT_DIR.DS.__get_config('Log.Log_dir').'/file_RW_error.log');
        $this->set("isLog", true);
        $this->SetInfo($fname, $mask);
    }
    
    //设置文件的相关信息
    function SetInfo($fname, $mask = "0x755"){
        $finfo = pathinfo($fname);
        $this->fname    = $finfo['basename'];
        $this->path        = $finfo['dirname'];
        $this->realpath    = str_replace("\\", "/", realpath($finfo['dirname']));
        $this->fullname    = $this->realpath."/".$this->fname;
        $this->extname     = $finfo['extension'];
        $this->mask        = $mask;
        //文件不存在的时候，文件的容量设置为NULL，以区别容量为0的文件
        $this->size        = file_exists($this->fullname)?filesize($this->fullname):NULL;
    }
    
    //读取文件的内容
    //@param &$temp 是读取出来的文件内容
    //@return 成功返回true，失败返回false
    function ReadFile(&$temp){
        try {
            //判断所提供的文件名是否文件
            if(!is_file($this->fullname)){
                throw new MC_Exception("文件无法读取，所指定内容 {$this->fullname} 不是文件");
            }
            //判断文件是否存在
            if($this->size === NULL){
                throw new MC_Exception("文件无法读取，文件 {$this->fullname} 不存在");
            }else{
                $temp = file_get_contents($this->fullname);
                if($temp === false)
                    throw new MC_Exception("文件 {$this->fullname} 读取失败");
            }
        } catch (MC_Exception $e) {
            $this->errorLog($e->getMessage());
            return false;
        }
        return true;
    }
    
    //将内容写入文件
    //@param $content 写入的内容
    //@param $mode 写入方式，默认是'w'
    //@return 成功返回写入的字符数，出现错误时则返回 FALSE 
    function WriteFile($content, $mode='w'){
//        if (is_writable($filename)) {
//
//            在这个例子里，我们将使用添加模式打开$filename，
//            因此，文件指针将会在文件的开头，
//            那就是当我们使用fwrite()的时候，$somecontent将要写入的地方。
//           if (!$handle = fopen($filename, 'a')) {
//                echo "不能打开文件 $filename";
//                exit;
//           }
//        
//            将$somecontent写入到我们打开的文件中。
//           if (fwrite($handle, $somecontent) === FALSE) {
//               echo "不能写入到文件 $filename";
//               exit;
//           }
//        
//           echo "成功地将 $somecontent 写入到文件$filename";
//        
//           fclose($handle);
//        
//          } else {
//             echo "文件 $filename 不可写";
//          }
        
        try {
            //判断文件是否存在，如果存在，判断是否可以写入，如果不存在先创建
            if(file_exists($this->fullname)){
                //判断所提供的文件名是否文件
                if(!is_file($this->fullname)){
                    throw new MC_Exception("文件无法写入，所指定内容 {$this->fullname} 不是文件");
                }
                if(!is_writable($this->fullname)){
                    throw new MC_Exception("文件无法写入，文件 {$this->fullname} 不可写入（没有权限或只读）");
                }
            }else{
                //创建文件
                if($this->CreateFile()===false)
                    return false;
            }
            if (!$fp = fopen($this->fullname, $mode)) {
                throw new MC_Exception("文件无法写入，文件 {$this->fullname} 无法打开");
            }
            $bytes = fwrite($fp, $content);
            if($bytes===false){
                throw new MC_Exception("文件 {$this->fullname} 写入失败");
            }
            fclose($fp);
        } catch (MC_Exception $e) {
            @fclose($fp);
            $this->errorLog($e->getMessage());
            return false;
        }
        return $bytes;
    }
    
    //创建一个新的文件，内容为空
    //@return 成功返回 true，出现错误时则返回 FALSE 
    function CreateFile(){
        try{
            //判断文件是否存在，如果存在，判断是否可以写入，如果不存在先创建
            if(!file_exists($this->fullname)){
                //创建文件
                if (!$fp = fopen($this->fullname, 'w')) {
                    throw new MC_Exception("文件 {$this->fullname} 创建失败");
                }
                fclose($fp);
            }else{
                throw new MC_Exception("文件 {$this->fullname} 已经存在，无法创建");
            }
        } catch (MC_Exception $e) {
            @fclose($fp);
            $this->errorLog($e->getMessage());
            return false;
        }
        return true;
    }
    
    //删除当前文件
    //@param $target = $this->fullname 要删除的目标文件名
    //@return 成功返回true，出现错误时则返回 FALSE 
    function DeleteFile($target=''){
        if($target == '') $target = $this->fullname;
        try {
            //判断文件是否存在
            if(!file_exists($target)){
                throw new MC_Exception("文件 {$target} 不存在，无法删除");
            }else{
                //判断所提供的文件名是否文件
                if(!is_file($target)){
                    throw new MC_Exception("文件无法删除，所指定内容 {$target} 不是文件");
                }
                $result = unlink($target);
                if($result === false)
                    throw new MC_Exception("文件 {$target} 删除失败");
            }
        } catch (MC_Exception $e) {
            $this->errorLog($e->getMessage());
            return false;
        }
        return true;
    }
    
    //文件复制
    //将当前文件复制到新的文件
    //@param $source = $this->fullname 源文件名，默认为当前文件
    //@param $target = "{$this->fullname}.bak" 目标文件名，默认为当前文件名.bak
    //@return 成功返回 true，失败返回 false
    function CopyFile($target='', $source=''){
        if($source == '') $source = $this->fullname;
        if($target == '') $target = $source.".bak";
        try{
            //判断文件是否存在
            if(!file_exists($source)){
                throw new MC_Exception("文件 {$source} 不存在，无法复制");
            }
            //判断所提供的文件名是否文件
            else if(!is_file($source)){
                throw new MC_Exception("文件无法复制，所指定内容 {$source} 不是文件");
            }
            //判断目标文件是否存在，如果存在就删除
            else if(file_exists($target)){
                if( is_file($target) ){
                    //删除存在文件
                    if($this->DeleteFile($target)===false){
                        return false;
                    }
                }else{
                    throw new MC_Exception("文件无法复制，所指定内容 {$target} 不是文件");
                }
            }
            //拷贝文件
            if(!copy($source, $target))
                throw new MC_Exception("文件 {$source} 复制到 {$target} 失败");
                
        } catch (MC_Exception $e) {
            $this->errorLog($e->getMessage());
            return false;
        }
        return true;
    }
    
    //按行读取文件
    //@return 成功 返回读取内容array ，失败返回 false
    function GetLines(){
    
    }
    

    //设置文件的目录名
    function SetPath($path){
        $this->path = dirname($path);
    }
    
}

?>
